package team.kirohuji.service.tidings;

import java.util.List;

import team.kirohuji.domain.article.Article;
import team.kirohuji.domain.tidings.Notify;
import team.kirohuji.domain.tidings.Subscription;
import team.kirohuji.domain.tidings.UserNotify;

/**
 * 消息服务
 * 
 * @author kirohuji
 *
 */
public interface NotifyService {
	/**
	 * 往Notify表中插入一条公告记录
	 * @param topic
	 *            主题
	 * @param content
	 *            内容
	 * @param senderId
	 *            发送者
	 * @return @see Notify
	 */
	public Notify createAnnounce(String topic,String content, Integer senderId);

	/**
	 * 往Notify表中插入一条提醒记录
	 * 
	 * @param targetId
	 *            目标
	 * @param targetType
	 *            目标类型
	 * @param action
	 *            动作
	 * @param content
	 *            内容
	 * @param senderId
	 *            发送者
	 * @return @see Notify
	 */
	public Notify createRemind(Integer targetId, String targetType, String action, String content, Integer senderId);

	/**
	 * 1. 往Notify表中插入一条信息记录 2. 往UserNotify表中插入一条记录，并关联新建的Notify
	 * 
	 * @param content
	 *            内容
	 * @param senderId
	 *            发送者
	 * @param receiverId
	 *            接收者
	 * @return @see UserNotify
	 */
	public UserNotify createMessage(String content, Integer senderId, Integer receiverId);

	/**
	 * 1.从UserNotify中获取最近的一条公告信息的创建时间: lastTime 2.用lastTime作为过滤条件，查询Notify的公告信息
	 * 3.新建UserNotify并关联查询出来的公告信息
	 * 
	 * @param userId
	 *            用户
	 * @return @see Notify
	 */
	public Notify pullAnnounce(Integer userId);

	/**
	 * 1.查询用户的订阅表，得到用户的一系列订阅记录
	 * 2.通过每一条的订阅记录的target、targetType、action、createdAt去查询Notify表，获取订阅的Notify记录。（注意订阅时间必须早于提醒创建时间）
	 * 3.查询用户的配置文件SubscriptionConfig，如果没有则使用默认的配置DefaultSubscriptionConfig
	 * 4.使用订阅配置，过滤查询出来的Notify 5.使用过滤好的Notify作为关联新建UserNotify
	 * 
	 * @param userId
	 *            用户
	 * @return 
	 */
	public List<Notify> pullRemind(Integer userId);

	/**
	 * 1.通过reason，查询NotifyConfig，获取对应的动作组:actions 2.遍历动作组，每一个动作新建一则Subscription记录
	 * 
	 * @param userId
	 *            用户
	 * @param targetId
	 *            目标
	 * @param targetType
	 *            目标类型
	 * @param reasion
	 * @return String 返回订阅主题
	 */
	public String subscribe(Integer userId, Integer targetId, String targetType, String reasion);

	/**
	 * 删除user、target、targetType对应的一则或多则记录
	 * 
	 * @param userId
	 *            用户
	 * @param targetId
	 *            目标
	 * @param targetType
	 *            目标类型
	 * @return boolean true|false 是否成功
	 */
	public String cancelSubscription(Integer userId, Integer targetId, String targetType);

/*	*//**
	 * 查询SubscriptionConfig表，获取用户的订阅配置
	 * 
	 * @param userId
	 *            用户
	 * @return @see SubscriptionConfig
	 *//*
	public SubscriptionConfig getSubscriptionConfig(Integer userId);

	*//**
	 * 更新用户的SubscriptionConfig记录
	 * 
	 * @param config
	 *            参数
	 * @return @see SubscriptionConfig
	 *//*
	public SubscriptionConfig updateSubscriptionConfig(SubscriptionConfig config);*/

	/**
	 * 获取用户的消息列表
	 * 
	 * @param userId
	 *            用户
	 * @return @see UserNotify
	 */
	public List<UserNotify> getUserNotify(Integer userId);

	/**
	 * 更新指定的notify，把isRead属性设置为true
	 * 
	 * @param userId
	 *            用户
	 * @param notifyId
	 *            一组notify
	 * @return boolean true|false 是否成功
	 */
	public boolean read(Integer userId, Integer... notifyIds);

	public Notify notifyRemind(Integer targetId, String targetType, String action, Notify notify);

	public List<Subscription> getSubscription(Integer userId);

	public Long getUnreadRemind(Integer userId);

	public void publish(Article article);

}
